package callback.syn.example2;

/**
 * 回调不是可口可乐，全世界一个味道。回调是一种思想，具体实现方式有很多
 * 回调方法就是：作为参数传入另一个方法的方法
 * Just understand that it is just a name to describe "a method that's supplied as an argument to another method",
 * such that when the parent method is called (whatever condition, such as a button click, a timer tick etc) and
 * its method body completes, the callback function is then invoked.
 */

interface DoJob {
    /**
     * 接口里定义回调方法，该方法不需要传入实现接口的类的实例对象
     * @param a
     * @param b
     * @param result
     */
    void fillBlank(int a, int b, int result);
}

/**
 *
 * @author
 * 不实现接口方法的类
 */
public class SuperCalculator {

    /**
     * 对于不需要实现接口的类，
     * 1 必须有一个方法要求传入一个实现了接口的类的实例对象来调用回调方法
     * 2 不一定需要持有一个接口定义的对象
     *
     * 方法包含一个实现接口的对象的引用
     * @param a
     * @param b
     * @param customer
     */
    public void add(int a, int b, DoJob customer) {
        int result = a + b;
        customer.fillBlank(a, b, result);
    }
}

/**
 * 需要实现接口的类，不一定直接实现，可以通过内部类来实现
 *
 *
 */
class Student {
    private String name = null;

    public Student(String name) {
        // TODO Auto-generated constructor stub
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 用一个内部类来实现接口，重写方法
     */
    public class DoHomeWork implements DoJob {

        /**
         * 回调函数，因为是被DoHomeWork对象调用的
         * @param a
         * @param b
         * @param result
         */
        @Override
        public void fillBlank(int a, int b, int result) {
            // TODO Auto-generated method stub
            System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
        }
    }

    /**
     * 实现接口的类必须调用不实现接口的类的方法
     * @param a
     * @param b
     */
    public void callHelp (int a, int b) {
        new SuperCalculator().add(a, b, new DoHomeWork());
    }
}

/**
 * 需要实现接口的类，不一定直接实现，可以通过内部类来实现
 */
class Seller {
    private String name = null;

    public Seller(String name) {
        // TODO Auto-generated constructor stub
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public class DoHomeWork implements DoJob {

        @Override
        public void fillBlank(int a, int b, int result) {
            // TODO Auto-generated method stub
            System.out.println(name + "求助小红算账:" + a + " + " + b + " = " + result + "元");
        }
    }

    public void callHelp (int a, int b) {
        new SuperCalculator().add(a, b, new DoHomeWork());
    }
}


